package fr.miage.dao.traitements;
/*
 * A SUIVRE
 */
import java.util.ArrayList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import fr.miage.client.metier.entite.Admin;
import fr.miage.client.metier.entite.Categorie;
import fr.miage.client.metier.entite.Civilite;
import fr.miage.client.metier.entite.Client;
import fr.miage.client.metier.entite.Commande;
import fr.miage.client.metier.entite.Produit;
import fr.miage.client.metier.entite.Role;
import fr.miage.client.metier.entite.Ville;

/**
 * @author kristela
 *
 */
public class AdminDao {
	/**
	 * Retourne une session.
	 * 
	 * @return la session.
	 */
	public static Session getSession() {
		Configuration config = new Configuration();
		config.addClass(Client.class);
		config.addClass(Commande.class);
//		config.addClass(Lignecommande.class);
		config.addClass(Produit.class);
		config.addClass(Admin.class);
		config.addClass(Categorie.class);
		config.addClass(Civilite.class);
		config.addClass(Role.class);
		config.addClass(Ville.class);
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		return session;
	}

	/**
	 * Ajoute un nouveau client dans la base de donnees.
	 * 
	 * @param admin
	 *            le admin a ajouter.
	 */
	public static void insertAdmin(Admin admin) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.saveOrUpdate(admin);
//			int s=session.createSQLQuery("INSERT INTO Admin VALUES("+admin.getIdAdmin()+",\""+client.getNom()+"\");").executeUpdate();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}


	public static Admin selectAdmin(Admin admin){
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
//		String sql=getAdminCritere(admin);
//		Integer id= (Integer)session.createSQLQuery(sql).uniqueResult();
//		Object ad =session.createSQLQuery(sql).uniqueResult();
		Admin ad=new Admin();
		session.load(ad, admin.getIdAdmin());
		return ad;
	}

	/**
	 * Renvoie la liste de touts les admins.
	 * 
	 * @return tous les admins.
	 */
	public static List<Admin> selectAllAdmin() {
		List<Admin> listAdmin = new ArrayList<Admin>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		listAdmin=session.find("from Admin"); 

//		listAdmin =session.createSQLQuery("SELECT * FROM Client;").list();
		session.close();
		session.getSessionFactory().close();
		return listAdmin;
	}

	/**
	 * Effacer le compte epargne correspondant a un numero.
	 * 
	 * @param numero
	 *            le numero du compte.
	 */
	public static void deleteAdmin(Admin admin) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.delete(admin);
		}
	}
	
	public static void updateAdmin(Admin admin) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.update(admin);
		}
	}
	
	public static String getAdminCritere(Admin admin){
		StringBuffer sql=new StringBuffer("SELECT * FROM admin  WHERE idAdmin="+admin.getIdAdmin()+" ");
		if(admin.getLogin()!=null){
			sql.append("AND login=\""+ admin.getLogin()+"\" ");
		}
		if(admin.getPassword()!=null){
			sql.append("AND password=\""+admin.getPassword()+"\" ");
		}
		if (admin.getEmail()!=null) {
			sql.append("AND email=\""+admin.getEmail()+"\" ");
		}
		if (admin.getRole()!=null) {
			sql.append("AND role=\""+admin.getRole()+"\" ");
		}
		sql.append(";");
		return sql.toString();
	}
	
//	public static void main(String[] args){
//		Admin admin = new Admin();
//		admin.setIdAdmin(24);
////		admin.setLogin("login");
////		admin.setEmail("lolo");
////		admin.setPassword("pasword");
////		byte[]bRole={1,2,3};
////		Role role = new Role("chef",bRole);
//////		RoleDao.insertRole(role);
////		admin.setRole(role);
////		AdminDao.deleteAdmin(admin);
//		Admin ad=AdminDao.selectAdmin(admin);
//		deleteAdmin(ad);
////		System.out.println("*************"+ad+"**************");
////		System.out.println("**************"+((Admin)ad).getLogin());
////		List<Admin> l =selectAllAdmin();
////		System.out.println("***********"+l+"**************");
////		deleteAdmin(admin);
//	}
//	/**
//	 * Cree un compte espece pour un client.
//	 * 
//	 * @param client
//	 *            le client.
//	 * @param numero
//	 *            le numero de compte.
//	 * @param solde
//	 *            le solde associe au compte.
//	 */
//	public static void createCompteEspeceForClient(Client client,
//			String numero, String solde) {
//		Session session=getSession();
//		if (session == null) {
//			System.out.println("Pas de connexion!");
//			System.exit(0);
//		}
//		Transaction tx = null;
//		try {
//			tx = session.beginTransaction();
//			int idClient=ClientDao.getID(client);
//			int s=session.createSQLQuery("INSERT INTO CompteEspece VALUES("+idClient+",\""+numero+"\",\""+client.getNom()+"\",\""+solde+"\");").executeUpdate();
//			tx.commit();
//		} catch (Exception e) {
//			if (tx != null) {
//				tx.rollback();
//			}
//			e.printStackTrace();
//		} finally {
//			session.close();
//		}
//
//		session.getSessionFactory().close();
//	}
//	public static int getID(Client client){
//		Session session=getSession();
//		if (session == null) {
//			System.out.println("Pas de connexion!");
//			System.exit(0);
//		}
//		Integer id= (Integer)session.createSQLQuery("SELECT idClient FROM Client WHERE nom=\""+client.getNom()+"\";").uniqueResult();
//		client.setIdClient(id.intValue());
//		return id.intValue();
//	}
	
	

	
	
//	/**
//	 * Associe un compte a un client.
//	 * 
//	 * @param client
//	 *            le client.
//	 * @param numero
//	 *            le numero de compte.
//	 */
////	public static void createCompteEpargneForClient(Client client,
////			String numero, String taux) {
////		Session session=getSession();
////		if (session == null) {
////			System.out.println("Pas de connexion!");
////			System.exit(0);
////		}
//	//	CompteEpargne compteEparge= new CompteEpargne(numero, client.getNom(), taux);
//		Transaction tx = null;
//		try {
//			tx = session.beginTransaction();
//			int idClient=ClientDao.getID(client);
//			int s=session.createSQLQuery("INSERT INTO CompteEpargne VALUES("+idClient+",\""+numero+"\",\""+client.getNom()+"\",\""+taux+"\");").executeUpdate();
//			tx.commit();
//		} catch (Exception e) {
//			if (tx != null) {
//				tx.rollback();
//			}
//			e.printStackTrace();
//		} finally {
//			session.close();
//		}
//
//		session.getSessionFactory().close();
//	}
//
	
	
/**
	 * Retourne le compte d'un client.
	 * 
	 * @param client
	 * @return le compte du client.
	 */
	/*
	public static List<Compte> getCompteByClient(Client client) {
		List <CompteEpargne> lCompteEpargne= new ArrayList<CompteEpargne>();
		List <CompteEspece> lCompteEspece= new ArrayList<CompteEspece>();
		
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		lCompteEpargne=session.createSQLQuery("SELECT * FROM CompteEpargne WHERE nom=\""+client.getNom()+"\";").list();
		lCompteEspece=session.createSQLQuery("SELECT * FROM CompteEspece WHERE nom=\""+client.getNom()+"\";").list();
		List<Compte>lcompte = new ArrayList<Compte>();
		for(int i=0; i<lCompteEpargne.size(); i++){
			lcompte.add(lCompteEpargne.get(i));
		}
		for(int i=0; i<lCompteEspece.size(); i++){
			lcompte.add(lCompteEspece.get(i));
		}
		return lcompte;
	}

	/**
	 * Renvoi tous les clients de la base avec leur comptes.
	 * 
	 * @return une liste de clients.
	 */
	/*
	public static List<Client> getAllClientWithCompte() {
		List<Client> lClient = new ArrayList<Client>();
		
			Session session = getSession();
			if (session == null) {
				System.out.println("Pas de connexion!");
				System.exit(0);
			}
			lClient= getAllClient();
			for(int i=0; i<lClient.size(); i++){
				List<Compte>lCompte = getCompteByClient((Client)lClient.get(i));
				lClient.get(i).setLcompte(lCompte);
			}
			return lClient;
	}
	

	/**
	 * Affiche sur la console le contenu de la liste des comptes du client.
	 * 
	 * @param lcompte
	 *            la liste des comptes du client.
	 */
	/*
	public static void affichageCompte(List<Compte> lcompte) {
		System.out.println("Les comptes : ");
		for (int i = 0; i < lcompte.size(); i++) {
			System.out.print("Nr. compte : " + lcompte.get(i).getNumero());
			if (lcompte.get(i) instanceof CompteEspece) {
				System.out.println("     Solde : "
						+ ((CompteEspece) lcompte.get(i)).getSolde()
						+ "   type= compte espece ");
			} else {
				System.out.println("     Taux : "
						+ ((CompteEpargne) lcompte.get(i)).getTaux()
						+ "   type= compte epargne ");
			}
		}
	}

//	/**
//	 * Affiche sur cosole les comptes espace d'un client.
//	 * 
//	 * @param lcompteEspece
//	 *            la liste de comptes espece du client.
//	 */
//	public static void affichageCompteEspece(List<CompteEspece> lcompteEspece) {
//		System.out.println("Compte Espece : ");
//		for (int i = 0; i < lcompteEspece.size(); i++) {
//			System.out.println("Nr. compte : "
//					+ lcompteEspece.get(i).getNumero() + "    Solde : "
//					+ lcompteEspece.get(i).getSolde());
//		}
//		System.out.println();
//	}
//
//	/**
//	 * Affiche sur cosole les comptes epargne d'un client.
//	 * 
//	 * @param lcompteEpargne
//	 *            la liste de comptes epargne du client.
//	 */
//	public static void affichageCompteEpargne(List<CompteEpargne> lcompteEpargne) {
//		System.out.println("Compte Epargne : ");
//		for (int i = 0; i < lcompteEpargne.size(); i++) {
//			System.out.println("Nr. compte : "
//					+ lcompteEpargne.get(i).getNumero() + "    Taux : "
//					+ lcompteEpargne.get(i).getTaux());
//		}
//		System.out.println();
//	}

	/**
	 * Modifier le nom s'un client dans la base de données.
	 * 
	 * @param newNom
	 * @param oldNom
	 */
	/*
	public static void updateClient(String newNom, String oldNom) {

		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
		Client client=(Client)session.createSQLQuery("SELECT c FROM Client c WHERE c.nom=\""+oldNom+"\";").uniqueResult();
		client.setNom(newNom);
		session.update(client);
		List<Compte> lCompte= getCompteByClient(client);
		for(int i=0; i<lCompte.size(); i++){
			lCompte.get(i).setNom(newNom);
			session.update(lCompte.get(i));
		}
		tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}


	/**
	 * Modifier le solde d'un compte epargne.
	 * 
	 * @param numero
	 *            le numero de compte.
	 * @param newTaux
	 *            la nouvelle valeur de taux.
	 */
	/*
	public static void updateCompteEpargne(int id, String newTaux) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			CompteEpargne compteEpargne =(CompteEpargne)session.createSQLQuery("SELECT c FROM CompteEpargne WHERE c.id="+id+";").uniqueResult();
			compteEpargne.setTaux(newTaux);
			session.update(compteEpargne);
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}

	public static void updateCompteEspece(int id, String newSolde){
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			CompteEspece compteEspece =(CompteEspece)session.createSQLQuery("SELECT c FROM CompteEspece WHERE c.id="+id+";").uniqueResult();
			compteEspece.setSolde(newSolde);
			session.update(compteEspece);
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	
//	/**
//	 * Effacer un client de la base de données.
//	 * 
//	 * @param nom
//	 *            le nom du client.
//	 */
//	public static void deleteClient(String nom) {
//		Connection connexion = connexion();
//		if (connexion == null) {
//			System.out.println("Pas de connexion!");
//			System.exit(0);
//		}
//		String requete1 = "DELETE FROM Client WHERE nom=\"" + nom + "\";";
//		String requete2 = "DELETE FROM CompteEpargne WHERE nom=\"" + nom
//				+ "\";";
//		String requete3 = "DELETE FROM CompteEpargne WHERE nom=\"" + nom
//				+ "\";";
//		Statement stmt;
//		try {
//			stmt = connexion.createStatement();
//			int r1 = stmt.executeUpdate(requete1);
//			int r2 = stmt.executeUpdate(requete2);
//			int r3 = stmt.executeUpdate(requete3);
//		} catch (SQLException e) {
//			System.out.println(e.getMessage());
//			e.printStackTrace();
//		}
//	}
//
//	/**
//	 * Effacer le compte espece correspondant a un numero.
//	 * 
//	 * @param numero
//	 *            le numero du compte
//	 */
//	public static void deleteCompteEspece(String numero) {
//		Connection connexion = connexion();
//		if (connexion == null) {
//			System.out.println("Pas de connexion!");
//			System.exit(0);
//		}
//		Statement stmt;
//		String requete2 = "DELETE FROM CompteEspece WHERE numero=\"" + numero
//				+ "\";";
//		try {
//			stmt = connexion.createStatement();
//			int r = stmt.executeUpdate(requete2);
//		} catch (SQLException e) {
//			System.out.println(e.getMessage());
//			e.printStackTrace();
//		}
//	}
//
//		Statement stmt;
//		String requete2 = "DELETE FROM CompteEpargne WHERE numero=\"" + numero
//				+ "\";";
//		try {
//			stmt = connexion.createStatement();
//			int r = stmt.executeUpdate(requete2);
//		} catch (SQLException e) {
//			System.out.println(e.getMessage());
//			e.printStackTrace();
//		}
//	}
	/*
	public static void afficheData(){
		System.out.println("************ Les Clients***********");
		List<Client> lClient = new ArrayList<Client>();
		lClient= ClientDao.getAllClientWithCompte();
		for(int i=0; i<lClient.size();i++){
			System.out.println("Nom : "+ lClient.get(i).getNom());
			ClientDao.affichageCompte(lClient.get(i).getLcompte());
		}
		System.out.println("************************************");
	}

	/**
	 * Methode main
	 * 
	 * @param args
	 */
//	public static void main(String[] args) {
//		Client client= new Client("titi");
//		ClientDao.saveClient(client);
//		ClientDao.createCompteEpargneForClient(client, "139", "145");
//		ClientDao.createCompteEspeceForClient(client, "159", "145");
//		List<Client> lClient = ClientDao.getAllClient();
//		ClientDao.afficheData();
//		ClientDao.affichageCompte(ClientDao.getCompteByClient(client));
//		ClientDao.updateClient("kra", "kris");
//		ClientDao.affichageCompte(ClientDao.getCompteByClient(client));
//		ClientDao.afficheData();
//		System.out.println(lClient);
////		List<Client> lClient2 = ClientDao.getAllClientWithCompte();
////		System.out.println("All Client with compte" + lClient2);
////		ClientDao.updateClient("cc140", "cc139");
////		ClientDao.deleteCompteEpargne("140");
////		lClient = ClientDao.getAllClientWithCompte();
////		System.out.println(lClient);

	}


